home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ASME's Mechanical Engine…ing Toolkit 1997 December
/
ASME's Mechanical Engineering Toolkit 1997 December.iso
/
main_frm
/
vi.zoo
/
tos.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-06-07
|
5KB
|
303 lines
/*
* System-dependent routines for the Atari ST.
*/
#include "stevie.h"
#include <osbind.h>
/*
* The following buffer is used to work around a bug in TOS. It appears that
* unread console input can cause a crash, but only if console output is
* going on. The solution is to always grab any unread input before putting
* out a character. The following buffer holds any characters read in this
* fashion. The problem can be easily produced because STEVIE can't yet keep
* up with the normal auto-repeat rate in insert mode.
*/
#define IBUFSZ 128
static long inbuf[IBUFSZ]; /* buffer for unread input */
static long *inptr = inbuf; /* where to put next character */
/*
* inchar() - get a character from the keyboard
*
* Certain special keys are mapped to values above 0x80. These
* mappings are defined in keymap.h. If the key has a non-zero
* ascii value, it is simply returned. Otherwise it may be a
* special key we want to map.
*
* The ST has a bug involving keyboard input that seems to occur
* when typing quickly, especially typing capital letters. Sometimes
* a value of 0x02540000 is read. This doesn't correspond to anything
* on the keyboard, according to my documentation. My solution is to
* loop when any unknown key is seen. Normally, the bell is rung to
* indicate the error. If the "bug" value is seen, we ignore it completely.
*/
int
inchar()
{
for (;;) {
long c, *p;
/*
* Get the next input character, either from the input
* buffer or directly from TOS.
*/
if (inptr != inbuf) { /* input in the buffer, use it */
c = inbuf[0];
/*
* Shift everything else in the buffer down. This
* would be cleaner if we used a circular buffer,
* but it really isn't worth it.
*/
inptr--;
for (p = inbuf; p < inptr ;p++)
*p = *(p+1);
} else
c = Crawcin();
if ((c & 0xff) != 0)
return ((int) c);
switch ((int) (c >> 16) & 0xff) {
case 0x62: return K_HELP;
case 0x61: return K_UNDO;
case 0x52: return K_INSERT;
case 0x47: return K_HOME;
case 0x48: return K_UARROW;
case 0x50: return K_DARROW;
case 0x4b: return K_LARROW;
case 0x4d: return K_RARROW;
case 0x29: return K_CGRAVE; /* control grave accent */
/*
* Occurs due to a bug in TOS.
*/
case 0x54:
break;
/*
* Add the function keys here later if we put in support
* for macros.
*/
default:
beep();
break;
}
}
}
/*
* get_inchars - snarf away any pending console input
*
* If the buffer overflows, we discard what's left and ring the bell.
*/
static void
get_inchars()
{
while (Cconis()) {
if (inptr >= &inbuf[IBUFSZ]) { /* no room in buffer? */
Crawcin(); /* discard the input */
beep(); /* and sound the alarm */
} else
*inptr++ = Crawcin();
}
}
void
outchar(c)
char c;
{
get_inchars();
Cconout(c);
}
void
outstr(s)
register char *s;
{
get_inchars();
Cconws(s);
}
#define BGND 0
#define TEXT 3
/*
* vbeep() - visual bell
*/
static void
vbeep()
{
int text, bgnd; /* text and background colors */
long l;
text = Setcolor(TEXT, -1);
bgnd = Setcolor(BGND, -1);
Setcolor(TEXT, bgnd); /* swap colors */
Setcolor(BGND, text);
for (l=0; l < 5000 ;l++) /* short pause */
;
Setcolor(TEXT, text); /* restore colors */
Setcolor(BGND, bgnd);
}
void
beep()
{
if (P(P_VB))
vbeep();
else
outchar('\007');
}
/*
* remove(file) - remove a file
*/
void
remove(file)
char *file;
{
Fdelete(file);
}
/*
* rename(of, nf) - rename existing file 'of' to 'nf'
*/
void
rename(of, nf)
char *of, *nf;
{
Fdelete(nf); /* if 'nf' exists, remove it */
Frename(0, of, nf);
}
void
windinit()
{
if (Getrez() == 0)
Columns = 40; /* low resolution */
else
Columns = 80; /* medium or high */
P(P_LI) = Rows = 25;
Cursconf(1,NULL);
}
void
windexit(r)
int r;
{
exit(r);
}
void
windgoto(r, c)
int r, c;
{
outstr("\033Y");
outchar(r + 040);
outchar(c + 040);
}
/*
* System calls or library routines missing in TOS.
*/
void
sleep(n)
int n;
{
int k;
k = Tgettime();
while ( Tgettime() <= k+n )
;
}
void
delay()
{
long n;
for (n = 0; n < 8000 ;n++)
;
}
int
system(cmd)
char *cmd;
{
char arg[1];
arg[0] = (char) 0; /* no arguments passed to the shell */
if (Pexec(0, cmd, arg, 0L) < 0)
return -1;
else
return 0;
}
#ifdef MEGAMAX
char *
strchr(s, c)
char *s;
int c;
{
do {
if ( *s == c )
return(s);
} while (*s++);
return(NULL);
}
#endif
#ifdef MEGAMAX
FILE *
fopenb(fname, mode)
char *fname;
char *mode;
{
char modestr[10];
sprintf(modestr, "b%s", mode);
return fopen(fname, modestr);
}
#endif
/*
* getenv() - get a string from the environment
*
* Both Alcyon and Megamax are missing getenv(). This routine works for
* both compilers and with the Beckemeyer and Gulam shells. With gulam,
* the env_style variable should be set to either "mw" or "gu".
*/
char *
getenv(name)
char *name;
{
extern long _base;
char *envp, *p;
envp = *((char **) (_base + 0x2c));
for (; *envp ;envp += strlen(envp)+1) {
if (strncmp(envp, name, strlen(name)) == 0) {
p = envp + strlen(name);
if (*p++ == '=')
return p;
}
}
return (char *) 0;
}